#include "sessionfriendarea.h"

#include <QScrollBar>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QStyleOption>
#include <QPainter>

#include "model/data.h"
#include "debug.h"

SessionFriendArea::SessionFriendArea(QWidget *parent)
    : QScrollArea{parent}
{
    // 1. 设置必要的属性
    // 设置了这个属性, 才能够开启滚动效果
    this->setWidgetResizable(true);
    // 设置滚动条相关的样式
    this->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 2px; background-color: rgb(46, 46, 46);}");
    this->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 0px; }");
    this->setStyleSheet("QWidget { border: none;}");


    //2. 把 widget 创建出来
    container = new QWidget();
    container->setFixedWidth(310);
    this->setWidget(container);

    // 3. 给这个 widget 指定布局管理器, 以便后续添加元素进去
    QVBoxLayout* layout = new QVBoxLayout();
    layout->setContentsMargins(0, 0, 0, 0);
    layout->setSpacing(0);
    layout->setAlignment(Qt::AlignTop);
    container->setLayout(layout);

    //4. 简单测试一下滚动效果
    /*for(int i =0 ; i< 50; ++i)
    {
        QPushButton* btn = new QPushButton();
        btn->setText("按钮");
        layout->addWidget(btn);
    }
  */

    //构建出临时数据，用来作为 “界面调试” 的依据，后续要删除
#if TEST_UI
    QIcon icon(":/recource/image/yang.jpg");
    for(int i =0; i<30;++i)
    {
       this->addItem(SessionItemType,QString::number(i)  ,icon, "张三" + QString::number(i), "最后一条消息" + QString::number(i));
    }
#endif
}

void SessionFriendArea::clear()
{
    QLayout* layout = container->layout();
    //遍历布局管理器中的所有元素，并且依次从布局管理器中删除掉
    for(int i = layout->count() -1;i>=0;--i)
    {
        //takeAt 就能移除对应下标的元素
        QLayoutItem* item = layout->takeAt(i);

        //别忘了，还需要对这个对象进行 “释放”
        if(item->widget())
        {
            //把这个移除的内容的 widget 进行释放
            //正常的时候，new 出来的对象添加到布局管理器的。。。
            delete item->widget();
        }

    }
}

void SessionFriendArea::addItem(ItemType itemType,const QString& id,const QIcon& avatar,const QString& name, const QString& text)
{
    SessionFriendItem* item = nullptr;
    if (itemType == SessionItemType) {
        item = new SessionItem(this, id, avatar, name, text);
    } else if (itemType == FriendItemType) {
        item = new FriendItem(this, id, avatar, name, text);
    } else if (itemType == ApplyItemType) {
        item = new ApplyItem(this, id, avatar, name);
    } else {
        LOG() << "错误的 ItemType! itemType=" << itemType;
        return;
    }
    container->layout()->addWidget(item);
}

void SessionFriendArea::clickItem(int index)
{
    if(index <0 || index >= container->layout()->count()){
        LOG() << "点击元素的下标超出范围！ index="<<index;
        return;
    }
    QLayoutItem* layoutItem = container->layout()->itemAt(index);
    if(layoutItem == nullptr || layoutItem->widget()==nullptr)
    {
        LOG() << "指定的元素不存在! index="<< index;
        return;
    }
    SessionFriendItem* item = dynamic_cast<SessionFriendItem*>(layoutItem->widget());
    item->select();
}

///////////////////////////////////////////////////////
/// 滚动区域中的 Item 的实现
/// ///////////////////////////////////
SessionFriendItem::SessionFriendItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& text)
    :owner(owner)
{
    this->setFixedHeight(70);
    this->setStyleSheet("QWidget { background-color: rgb(231,231,231);}");

    //创建布局管理器
    QGridLayout* layout = new QGridLayout();
    layout->setContentsMargins(20,0,0,0);
    layout->setHorizontalSpacing(10);
    layout->setVerticalSpacing(0);
    this->setLayout(layout);

    //创建头像
    QPushButton* avatarBtn = new QPushButton();
    avatarBtn->setFixedSize(50,50);
    avatarBtn->setIconSize(QSize(50,50));
    avatarBtn->setIcon(avatar);
    avatarBtn->setStyleSheet("QPushButton {border: none;}");
    avatarBtn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

    //创建名字
    QLabel* nameLabel = new QLabel();
    nameLabel->setText(name);
    nameLabel->setStyleSheet("QLabel { font-size:18px;font-weight:600;color:#000 }");
    nameLabel->setFixedHeight(35);
    nameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    //创建消息预览
    messageLabel = new QLabel();
    messageLabel->setText(text);
    messageLabel->setFixedHeight(35);
    messageLabel->setStyleSheet("color :#000");
    messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    //头像处于0，0，位置  占据2行 2 列
    layout->addWidget(avatarBtn,0,0,2,2);
    layout->addWidget(nameLabel,0,2,1,8);
    layout->addWidget(messageLabel,1,2,1,8);
}


void SessionFriendItem::paintEvent(QPaintEvent *event)
{
    QStyleOption opt;
    opt.initFrom(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget,&opt,&p,this);
}

void SessionFriendItem::mousePressEvent(QMouseEvent *event)
{
    (void)event;
    select();
}

void SessionFriendItem::enterEvent(QEnterEvent* event)
{
    (void)event;
    //当前这个 item 是被选中状态
    if(this->selected){
        return;
    }
    this->setStyleSheet("QWidget {background-color: rgb(215,215,215);}");
}


void SessionFriendItem::leaveEvent(QEvent* event)
{
    (void)event;
    if(this->selected){
        return;
    }
    this->setStyleSheet("QWidget {background-color: rgb(231,231,231);}");
}

void SessionFriendItem::select()
{
    //鼠标点击时会触发这个函数
    //点击时，修改背景色
    //不仅要设置当前 item 的背景色，还要还原其他元素的背景色
    this->setStyleSheet("QWidget { background-color: rgb(210,210,210);}");
    this->selected = true;

    //拿到所有的兄弟元素
    const QObjectList children = this->parentWidget()->children();
    for(QObject* child : children)
    {
        if(!child->isWidgetType())
        {
            //判断是否是 Widget
            continue;
        }
        //确实是Widget 就把这里的chiild 强转成SessionFriendItem
        SessionFriendItem* item = dynamic_cast<SessionFriendItem*>(child);
        if(item->selected)
        {
            item->selected = false;
            item->setStyleSheet("QWidget { background-color: rgb(231,231,231);}");

        }
    }

    //点击时，修改背景色
    //此处不仅仅要设置当前item 背景色，也要还原其他元素的背景色
    this->setStyleSheet("QWidget { background-color: rgb(210,210,210);}");
    this->selected = true;

    //调用 active
    this->active();
}

void SessionFriendItem::active()
{
    //父类的 active 不需要实现
    //
}

///////////////////////////////////////////////////////
/// 会话 Item 的实现
/// //////////////////////////////////////////////////
SessionItem::SessionItem(QWidget* owner, const QString& chatSessionId,const QIcon& avatar ,const QString& name,const QString& lastMessage)
    :SessionFriendItem(owner,avatar,name,lastMessage),chatSessionId(chatSessionId)
{

}

void SessionItem::active()
{
    //TDDO
    LOG()<< "点击了SessionItem 触发的逻辑 chatSessionId = "<< chatSessionId;
}

///////////////////////////////////////////////////////
/// 好友 Item 的实现
/// //////////////////////////////////////////////////
FriendItem::FriendItem(QWidget* owner,const QString& userId,const QIcon& avatar,const QString& name, const QString& description)
    :SessionFriendItem(owner,avatar,name,description),userId(userId)
{

}

void FriendItem::active()
{
    //TODO
    LOG()<< "点击FriendItem 触发的逻辑 userId = " << userId;
}

///////////////////////////////////////////////////////
/// 好友申请 Item 的实现
/// //////////////////////////////////////////////////

ApplyItem::ApplyItem(QWidget* owner, const QString& userId,const QIcon&avatar,const QString& name)
    :SessionFriendItem(owner,avatar,name,""),userId(userId)
{
    //1.移除父类的 messageLabel
    QGridLayout* layout = dynamic_cast<QGridLayout*> (this->layout());
    layout->removeWidget(messageLabel);
    //释放内存，避免内存泄露
    delete messageLabel;

    //2.创建两个按钮
    QPushButton* acceptBtn = new QPushButton();
    acceptBtn->setText("同意");
    QPushButton* rejectBtn = new QPushButton();
    rejectBtn->setText("拒绝");


    //3。添加到布局管理器中
    layout->addWidget(acceptBtn,1,2,1,1);
    layout->addWidget(rejectBtn,1,3,1,1);


}

void ApplyItem::active()
{
    LOG()<< "点击ApplyItem"<<"";
}
